﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Recursos.Model
{
    public class EspacioModel
    {
        public IList<TipoEspacio> CargarTipo()
        {
            var datacontext = new DataClassesRecursosDataContext();
            var tipoEspacios = new Repository<TipoEspacio>(datacontext);
            return tipoEspacios.GetAll().ToList();
        }

        public int CrearEspacio(int tipoEspacio, int sede, string estado, string descripcion, int carrera, string codigo, int capacidad,int cedula)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacios = new Repository<Espacio>(datacontext);
            var usuarios = new Repository<Usuario>(datacontext);
            var roles = new Repository<RolXUsuario>(datacontext);
            var usuario = usuarios.SearchOne(s=>s.Cedula==cedula);
            var rol = roles.SearchOne(s=>s.Usuario.Cedula==cedula);
            if (carrera != usuario.Carrera.id && usuario.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                return 0;
            var espacio = new Espacio { IdTipo = tipoEspacio, IdSede = sede,  estado = estado, IdCarrera = carrera, Capacidad = capacidad, Codigo = codigo, Descripcion = descripcion };
            espacios.Insert(espacio);
            datacontext.SubmitChanges();
            return 1;
        }

        public int ActualizarEspacio(int id, string codigo, int sede, int carrera, int capacidad, string estado, string descripcion, int tipoEspacio,int cedula)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacios = new Repository<Espacio>(datacontext);
            var duplicado = espacios.SearchOne(dup => dup.Codigo.Equals(codigo));
            if (duplicado.id != id)
                return 0;
            var usuarios = new Repository<Usuario>(datacontext);
            var roles = new Repository<RolXUsuario>(datacontext);
            var usuario = usuarios.SearchOne(s => s.Cedula == cedula);
            var rol = roles.SearchOne(s => s.Usuario.Cedula == cedula);
            if (carrera != usuario.Carrera.id && usuario.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                return 0;
            var espacio = espacios.GetById(id);
            espacio.IdCarrera = carrera;
            espacio.IdSede = sede;
            espacio.Codigo = codigo;
            espacio.IdTipo = tipoEspacio;
            espacio.Descripcion = descripcion;
            espacio.estado = estado;
            espacio.Capacidad = capacidad;
            datacontext.SubmitChanges();
            return id;
        }

        public IList<Espacio> CargarEspacios()
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacios = new Repository<Espacio>(datacontext);
            return espacios.GetAll().Where(s=>s.Codigo!="sin asignar").ToList();

        }
        public IList<Espacio> ObtenerEspaciosSede(int idSede)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacios = new Repository<Espacio>(datacontext);
            return espacios. SearchFor(s => s.IdSede == idSede && s.Codigo!="sin asignar").ToList();
        }

        public int ElminarEspacio(int espacioId,int cedula)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacios = new Repository<Espacio>(datacontext);
            var espacio=espacios.GetById(espacioId);
            var usuarios = new Repository<Usuario>(datacontext);
            var roles = new Repository<RolXUsuario>(datacontext);
            var usuario = usuarios.SearchOne(s => s.Cedula == cedula);
            var rol = roles.SearchOne(s => s.Usuario.Cedula == cedula);
            if ( espacio.Carrera.id!= usuario.Carrera.id && usuario.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                return 0;
            espacios.Delete(espacioId);
            datacontext.SubmitChanges();
            return 1;
        }

        public Espacio CargarPorId(int recursoId)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacios = new Repository<Espacio>(datacontext);
            return espacios.GetById(recursoId);
        }
    }
}